﻿using System;
using System.Diagnostics;
using System.Threading.Tasks;
namespace _9.回文数 {

    #region 题目
    /* 判断一个整数是否是回文数。回文数是指正序（从左向右）和倒序（从右向左）读都是一样的整数。
    示例 1:

    输入: 121
    输出: true
    示例 2:

    输入: -121
    输出: false
    解释: 从左向右读, 为 -121 。 从右向左读, 为 121- 。因此它不是一个回文数。
    示例 3:

    输入: 10
    输出: false
    解释: 从右向左读, 为 01 。因此它不是一个回文数。
    进阶:

    你能不将整数转为字符串来解决这个问题吗？
    */
    #endregion
    class Program {
        static void Main (string[] args) {

            TimeSpan ts1 = Process.GetCurrentProcess ().TotalProcessorTime;
            Stopwatch stw = new Stopwatch ();
            Console.WriteLine ("开始");
            stw.Start ();

           // GetResultByChars ().Wait ();

            GetResultByResidue ().Wait ();

            double second = Process.GetCurrentProcess ().TotalProcessorTime.Subtract (ts1).TotalMilliseconds;
            stw.Stop ();
            Console.WriteLine ("总共花费：" + second);
        }

        static async Task GetResultByChars () {
            Console.WriteLine ("GetResultByChars:" + "方法");
            Solution s = new Solution ();
            await Task.Run (() => {
                for (int i = 0; i < 9999999; i++) {
                    s.BackToTextNumber (121);
                    s.BackToTextNumber (1221);
                    s.BackToTextNumber (11311);
                    s.BackToTextNumber (12321);
                    s.BackToTextNumber (1234321);
                }

            });
        }
        static async Task GetResultByResidue () {
            Console.WriteLine ("GetResultByResidue:" + "方法");
            Solution s = new Solution ();
            await Task.Run (() => {
                for (int i = 0; i < 9999999; i++) {
                    s.IsPalindrome (121);
                    s.IsPalindrome (1221);
                    s.IsPalindrome (11311);
                    s.IsPalindrome (12321);
                    s.IsPalindrome (1234321);
                }
            });
        }
    }
    public class Solution {
        //数字转化为字符串的方法
        public bool BackToTextNumber (int x) {

            var chars_01 = x.ToString ().ToCharArray ();

            var chars_02 = new char[chars_01.Length];

            Array.Copy (chars_01, chars_02, chars_01.Length);

            var symbol = (chars_01[0] == '-');
            if (symbol) return false;

            Array.Reverse (chars_02);

            var count = chars_01.Length;

            //判断位数是偶数位还是奇数位
            count = (chars_01.Length % 2 == 0) ? (count / 2) : (count / 2 - 1);

            for (int i = 0; i < count; i++) {
                if (chars_01[i] != chars_02[i]) {
                    return false;
                }
            }
            return true;
        }
        //根据百分制求余
        public bool IsPalindrome (int x) {
            if (x < 0) return false;
            var digits = 1;
            //计算当前数字有几位
            for (var i = x; i / 10 != 0; i /= 10) digits++;
            //声明一个本地函数Pow,用于计算a^b，即a的b次方
            //121	索引	    0	      1	    2
            //      给定的数字	 1	       2	 1
            //      位数	    10^0	10^1	10^2    

            int Pow (int a, int b) => (int) Math.Pow (a, b);
            for (int i = 0, j = digits - i - 1; i < digits; i++, j--) {
                var first = x % Pow (10, i + 1) / Pow (10, i); //根据当前数字所占的百分位求余，获取当前位的值
                var second = x % Pow (10, j + 1) / Pow (10, j);

                if (first != second) { return false; }
            }
            return true;
        }
    }
}